﻿package app.view.components.calendar 
{
	import app.model.types.LangTypes;
	import app.view.events.UIEvent;
	
	import com.snzflash.components.grid.Grid;
	import com.snzflash.events.ComponentEvent;
	
	import flash.display.SimpleButton;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.text.TextField;
	import flash.text.TextFieldAutoSize;
	
	import org.casalib.display.CasaSprite;
	
	/**
	 * Контрол календаря, состоит из таблицы, заголовка ( месяц/год )
	 * @author firsoff maxim, snzflash.com, tel: +79222345364, skype: maxim.firsoff
	 */
	public class CalendarControlBase extends CasaSprite
	{
		public var labelTxt:TextField;
		public var backBtn:SimpleButton;
		public var nextBtn:SimpleButton;
		
		public static const NUM_ROWS:int = 5;
		public static const NUM_COLUMNS:int = 7;
		private var _data:Object;
		// MODEL
		private var _lang:String = LangTypes.DEFAULT;
		private var _minYear:Number = 2009;
		private var _maxYear:Number = 2011;
		private var _minMonth:Number = 4;
		private var _maxMonth:Number = 9;
		private var _months:Array;
		private var _currentMonth:int;
		private var _currentYear:Number;
		private var _dataProvider:Array;
		private var _monthsData:Array;
		private var _grid:Grid;
		
		public function CalendarControlBase() 
		{
			super();
			init();
		};
		
		private function init():void
		{
			labelTxt.autoSize = TextFieldAutoSize.CENTER;
			_months = [];
			
			
			// забиваем месяцы
			_months.push( { name: {rus:'Январь', eng: 'January', china: 'January'}, days: 31 } );
			_months.push( { name: {rus:'Февраль', eng: 'February', china: 'February'}, days: 28 } );
			_months.push( { name: {rus:'Март', eng: 'March', china: 'March'}, days: 31 } );
			_months.push( { name: {rus:'Апрель', eng: 'April', china: 'April'}, days: 30 } );
			_months.push( { name: {rus:'Май', eng: 'May', china: 'May'}, days: 31 } );
			_months.push( { name: {rus:'Июнь', eng: 'June', china: 'June'}, days: 30 } );
			_months.push( { name: {rus:'Июль', eng: 'July', china: 'July'}, days: 31 } );
			_months.push( { name: {rus:'Август', eng: 'August', china: 'August'}, days: 31 } );
			_months.push( { name: {rus:'Сентябрь', eng: 'September', china: 'September'}, days: 30 } );
			_months.push( { name: {rus:'Октябрь', eng: 'October', china: 'October'}, days: 31 } );
			_months.push( { name: {rus:'Ноябрь', eng: 'November', china: 'November'}, days: 30 } );
			_months.push( { name: { rus:'Декабрь', eng: 'December', china: 'December' }, days: 31 } );
			
			// define current date
			var d:Date = new Date();
			_currentMonth = d.getMonth();
			_currentYear = d.getFullYear();
			
			// create default data provider
			createDataProvider();
			initGrid();
			
			//trace(_currentMonth, _currentYear);
			
			// EVENTS
			backBtn.addEventListener( MouseEvent.CLICK, onBackClick);
			nextBtn.addEventListener( MouseEvent.CLICK, onNextClick);
		};
		
		/*
		 * 
		 * 	формат ввода данных такой:
			ключ [DD.MM.YY] - данные[ЛЮБОЙ ОБЪЕКТ ДАННЫХ]
			т.е. будет объект данных Date. у него 2 параметра:
			key = '3.5.10' ( или 12.11.10) - это 3 мая 2010 года
			data = {} - тут любые данные относящиеся к событию

			видимо будет массив таких объектов из которых я буду выбырать по дате - есть ли там эвенты и т.д.


		 * */
		private function updateDate():void
		{
			updateLabel();
			// определяем день недели для 1го дня месяца
			var fistDayMonth:int = new Date(_currentYear, _currentMonth, 1).getDay();
			// пустые ячейки
			var numStartEmtyCells:int = fistDayMonth == 0 ? 6 : fistDayMonth - 1;
			
			var totalDays:int = _months[_currentMonth].days;
			// поправка на високосный год
			if ( _currentMonth == 1 && _currentYear % 4 == 0)  totalDays = 29;
			var lastDayMonth:int = new Date(_currentYear, _currentMonth, totalDays).getDay();
			var numEndEmtyCells:int = 7 - lastDayMonth;
			
			// create fake data provider
			var maxCells:int = NUM_ROWS * NUM_COLUMNS + 1;
			var dp:Array = [];
			var cVO:CalendarVO;
			
			// current month data
			var currentMonthData:Object;
			var m:int;
			for each(var obj:Object  in _monthsData ) 
			{
				m = int(obj.content.text[1])
				if( _currentMonth == m-1)
				{
					currentMonthData = obj;
					break;
				};	
			};
			
//			trace('currentMonth : ' + currentMonth);
			
			//if ( _months ) { };
			var day:int;
			for (var i:int = 0; i < maxCells; i++) 
			{
				cVO = new CalendarVO();
				cVO.label = '';
				
//				 define data for cell
				
				if ( i >= numStartEmtyCells && i < (totalDays + numStartEmtyCells) ) 
				{
					day = (i  - numStartEmtyCells + 1);
					cVO.label = String( day );
					cVO.day = day;
					cVO.fullDateString = day + ' ' +_months[_currentMonth].name[_lang];
					//trace(cVO.fullDateString);
					if(currentMonthData && currentMonthData.cat && currentMonthData.cat[day] && currentMonthData.cat[day].event) 
					{
//						trace( currentMonth.cat[day].event)
						cVO.data =  currentMonthData.cat[day];
						cVO.state = CalendarVO.EVENT_STATE;
					};
				}
				else 
				{
					cVO.state = CalendarVO.EMPTY_STATE;
				}
				dp.push(cVO);
			};
			_grid.updateDataProvider(dp);
		};
		
		private function initGrid():void
		{
			_grid = new Grid();
			_grid.addEventListener(ComponentEvent.CREATION_COMPLETE, onCreateGrid);
			_grid.addEventListener(Event.CHANGE, onChangeGrid);
			_grid.verticalGap = 10;
			_grid.horizontalGap = 10;
			_grid.width = 1000;
			_grid.height = 600;
			_grid.x = 170;
			_grid.y = 55;
			_grid.itemRenderer = CalendarRendererBase;
			_grid.numColumns = NUM_COLUMNS;
			_grid.numRows = NUM_ROWS;
			_grid.dataProvider = _dataProvider;
			addChild(_grid);
		}
		
		private function onCreateGrid(event:ComponentEvent):void 
		{
			//trace('onCreateGrid');
			updateDate();
		};
		
		private function onChangeGrid(event:Event):void 
		{
			var o:Object = { };
			o.selected  =  _grid.selectedItem;
			o.today = getTodayItem();
			dispatchEvent( new UIEvent ( UIEvent.CALENDAR_CHANGE, false, false, o));
		};
		
		public function getTodayItem():CalendarVO
		{
			var result:CalendarVO;
			var dayOfTheMonth:Number = new Date().getDate();
			for each(var i:CalendarVO  in _grid.dataProvider) 
			{
				if ( i.day == dayOfTheMonth) 
				{
					
					result = i;
					break;
				};
			}
			return result;
		}
		
		private function createDataProvider():void
		{
			_dataProvider = [];
			var maxCells:int = NUM_ROWS * NUM_COLUMNS + 1;
			for (var i:int = 0; i < maxCells; i++) 
			{
				_dataProvider.push( new CalendarVO());
			};
		};
		
		private function updateLabel():void
		{
			labelTxt.text = _months[_currentMonth].name[_lang] + ' ' + _currentYear;
			//trace('updateLabel : ' + );
		}
		//public function get currentYear() { return ; }
		
		override public function destroy():void 
		{
			super.destroy();
			backBtn.removeEventListener( MouseEvent.CLICK, onBackClick);
			nextBtn.removeEventListener( MouseEvent.CLICK, onNextClick);
		};
		
		private function onNextClick(event:MouseEvent):void 
		{
			//var oldValue:Number = _currentMonth;
			_currentMonth++;
			if ( _currentMonth > _maxMonth) 
			{
				//_currentYear++;
				_currentMonth = _maxMonth;
				//if ( _currentMonth == oldValue) return;
			};
			updateDate();
		};
		
		private function onBackClick(event:MouseEvent):void 
		{
			//var oldValue:Number = _currentMonth;
			_currentMonth--;
			if ( _currentMonth < _minMonth) 
			{
				//_currentYear--;
				_currentMonth = _minMonth;
				//if ( _currentMonth == oldValue) return;
			};
			updateDate();
		};
		
		public function get data():Object { return _data; };
		
		public function set data(value:Object):void 
		{
			_data = value;
			_lang = value.lang;
//			trace(this, value.lang);
			// массив месяцев
			_monthsData = _data.data.cat;
			updateDate();
		};
	};
};